#include "cEngine.h"

#include <irrlicht.h>

using namespace irr;
using namespace scene;
using namespace core;
using namespace video;

//!##### КОНСТРУКТОР
cEngine::cEngine(E_DRIVER_TYPE driverType, dimension2du resolution, IEventReceiver* receiver,bool fullscreen, bool stencilBuffer, u8 bits, u8 antiAlias)
{
    //Заполняем структуру полученными параметрами
    SIrrlichtCreationParameters deviceParams;

    deviceParams.DriverType = driverType;           //видеодрайвер
    deviceParams.WindowSize = resolution;           //разрешение экрана
    deviceParams.Fullscreen = fullscreen;           //полноэкранность
    deviceParams.Stencilbuffer = stencilBuffer;     //стенсил буфер
    deviceParams.AntiAlias = antiAlias;             //антиалиасинг
    deviceParams.Bits = bits;                       //битность
    deviceParams.EventReceiver = receiver;          //обработчик событий
    //Далее идут параметры, указанные в конфиге
    deviceParams.LoggingLevel = DEFAULT_LOGGING_LEVEL;      //Политика ведения лога
    deviceParams.Doublebuffer = DEFAULT_DOUBLEBUF;          //Двойная буферизация
    deviceParams.Vsync = DEFAULT_VSYNC;                     //Вертикальная синхронизация
    //Получим системные объекты
    device = createDeviceEx(deviceParams);          //получение системного объекта движка
    smgr = device->getSceneManager();               //получаем указатель на менеджер сцены с движка
    driver = device->getVideoDriver();              //получаем указатель на видеодрайвер

    device->setWindowCaption(stringw(REVISION).c_str());
    device->getCursorControl()->setVisible(CURSOR_VISIBLE);
}

//!##### ДЕСТРУКТОР
cEngine::~cEngine()
{
    //dtor
}

void cEngine::addTestScene()
{
    //Поставим тестовую камеру, задав клавиши управления с помощью конфига cDefines
    SKeyMap keyMap[4];
    keyMap[0].Action = EKA_MOVE_FORWARD;
    keyMap[0].KeyCode = KEY_CAMERA_FWD;
    keyMap[1].Action = EKA_MOVE_BACKWARD;
    keyMap[1].KeyCode = KEY_CAMERA_BCK;
    keyMap[2].Action = EKA_STRAFE_LEFT;
    keyMap[2].KeyCode = KEY_CAMERA_LEFT;
    keyMap[3].Action = EKA_STRAFE_RIGHT;
    keyMap[3].KeyCode = KEY_CAMERA_RIGHT;
    camera = smgr->addCameraSceneNodeFPS(0,20,0.02f,0,keyMap,4);
    camera->setPosition(vector3df(-10,0,3));
    camera->setTarget(vector3df(0,0,0));
    //поставим тестовый объект
    ISceneNode* cube = smgr->addCubeSceneNode(1.0f);
    cube->getMaterial(0).setTexture(0,driver->getTexture("textures/cube.jpg"));;
    cube->setMaterialFlag(EMF_LIGHTING, false);
}

//!#####  ШАГ
void cEngine::step()
{
    if (receiverType > 0) greceiver->checkKeys();    //Если обрабочтик типа cGameReceiver. то проверим состояние клавиш и при необходимости выполним их команды

    driver->beginScene(true, true, SColor(200, 200, 200, 200));
        smgr->drawAll();
    driver->endScene();
}

//! Назначение движку обработчика событий
void cEngine::setEventReceiver(IEventReceiver* receiver)
{
    device->setEventReceiver(receiver);
    receiverType = 0;   //установим флаг типа обработчика событий на стандартный
}
void cEngine::setEventReceiver(cGameReceiver* r)
{
    greceiver = r;
    device->setEventReceiver(greceiver);
    greceiver->setupDevice(device);
    receiverType = 1;   //установим флаг типа обработчика события на cGameReceiver
}
